from rest_framework import serializers
from django_redis import get_redis_connection
from redis.exceptions import RedisError
import logging

logger = logging.getLogger('meiduo')

# 因为没有模型，所以用Serializer
class RegisterSMSCodeSerializer(serializers.Serializer):
    """
    校验 验证码和image_code_id
    注意:

1.要注意redis的值为bytes

2.进行校验时要调用lower(),来统一小写字母进行比较
    """
    # 设置字段
    # 用户输入的验证码
    text = serializers.CharField(label='用户输入的验证码',max_length=4,min_length=4,required=True)
    # redis中的　图片验证码的ｋｅｙ
    image_code_id = serializers.UUIDField(label='验证码唯一性id')

    #我们需要用到这两个字段,所以在validate中进行判断
    def validate(self, attrs):
        # params ---> data  ---> attrs --->
        #获取用户提交的验证码
        text = attrs['text']
        image_code_id = attrs['image_code_id']
        #链接redis,获取redis中的验证码
        redis_conn = get_redis_connection('code')
        redis_text = redis_conn.get('img_%s'%image_code_id)
        # 判断从redis中获取的验证码是否存在
        if redis_text is None:
            raise serializers.ValidationError('验证码已过期')
        #将redis中的验证码删除
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except RedisError as e:
            logger.error(e)
        # redis 中的图片验证码格式为二进制
        #对redis的验证码编码之后进行比对,要注意大小写问题
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码错误')
        # 必须返回，不然数据没法继续
        return attrs